gdk: Allow querying if a GL context is in legacy mode
authorEmmanuele Bassi <ebassi@gnome.org>
Tue, 6 Oct 2015 17:54:58 +0000 (18:54 +0100)
committerEmmanuele Bassi <ebassi@gnome.org>
Wed, 7 Oct 2015 15:21:57 +0000 (16:21 +0100)
We want to have the ability to fall back to legacy GL contexts when
creating them. In order to do so, we need to store the legacy bit on the
GdkGLContext, as well as being able to query it.

Setting the legacy bit from outside GDK is not possible; we cannot
create GL contexts in 3.2 core profile *and* compatibility modes at the
same time, and if we allowed users to select the legacy mode themselves,
it would break the creation of the GdkWindow's paint GL context.

What we do allow is falling back to legacy GL context if the platform
does not support 3.2 core profiles — for instance, on older GPUs or
inside virtualized environments.

We are also going to use the legacy bit internally, to choose which GL
API we can use when drawing GL content.

https://bugzilla.gnome.org/show_bug.cgi?id=756142

gdk/gdkglcontext.c
gdk/gdkglcontext.h
gdk/gdkglcontextprivate.h

index 4d71353df20d56c08ffb1e0432f65833f90c30d9..874f1adf07ac69b0101cd29ee14c0d592905708a 100644 (file)
@@ -103,6 +103,7 @@ typedef struct {
   guint extensions_checked : 1;
   guint debug_enabled : 1;
   guint forward_compatible : 1;
+  guint is_legacy : 1;
 
   GdkGLContextPaintData *paint_data;
 } GdkGLContextPrivate;
@@ -554,6 +555,38 @@ gdk_gl_context_get_required_version (GdkGLContext *context,
     *minor = min;
 }
 
+/**
+ * gdk_gl_context_is_legacy:
+ * @context: a #GdkGLContext
+ *
+ * Whether the #GdkGLContext is in legacy mode or not.
+ *
+ * The #GdkGLContext must be realized.
+ *
+ * Returns: %TRUE if the GL context is in legacy mode
+ *
+ * Since: 3.20
+ */
+gboolean
+gdk_gl_context_is_legacy (GdkGLContext *context)
+{
+  GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (context);
+
+  g_return_val_if_fail (GDK_IS_GL_CONTEXT (context), FALSE);
+  g_return_val_if_fail (priv->realized, FALSE);
+
+  return priv->is_legacy;
+}
+
+void
+gdk_gl_context_set_is_legacy (GdkGLContext *context,
+                              gboolean      is_legacy)
+{
+  GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (context);
+
+  priv->is_legacy = !!is_legacy;
+}
+
 /**
  * gdk_gl_context_realize:
  * @context: a #GdkGLContext
index c9603ea7626c6ad87582a15b5a5e0be44759ae30..daacd1e0c732ed2db4e8278dcb21df8406ac5ccf 100644 (file)
@@ -52,6 +52,8 @@ GDK_AVAILABLE_IN_3_16
 void                    gdk_gl_context_get_version              (GdkGLContext  *context,
                                                                  int           *major,
                                                                  int           *minor);
+GDK_AVAILABLE_IN_3_20
+gboolean                gdk_gl_context_is_legacy                (GdkGLContext  *context);
 
 GDK_AVAILABLE_IN_3_16
 void                    gdk_gl_context_set_required_version     (GdkGLContext  *context,
index 668dd0e2ac08c84ba3fdf36a1026df39b3c78e80..a4f19d649e10c920d92285b69ab3f2983b25e1f1 100644 (file)
@@ -69,6 +69,9 @@ typedef struct {
   GdkGLContextProgram *current_program;
 } GdkGLContextPaintData;
 
+void                    gdk_gl_context_set_is_legacy            (GdkGLContext    *context,
+                                                                 gboolean         is_legacy);
+
 void                    gdk_gl_context_upload_texture           (GdkGLContext    *context,
                                                                  cairo_surface_t *image_surface,
                                                                  int              width,